#include"include/muduo/net/EventLoop.h"
#include"include/muduo/net/TcpConnection.h"
#include"include/muduo/net/TcpServer.h"

#include<iostream>
#include<string>
#include<functional>
#include <unordered_map>

class TranslateServer{

    public:
    TranslateServer(int port):_server(&_baseloop,
    muduo::net::InetAddress("0.0.0.0",port),
    "TranslateServer",muduo::net::TcpServer::kReusePort
    )
    {
        //将我们的类成员，设置为服务器的回调处理函数
        //std::bind是一个函数适配器，对指定的函数进行参数绑定
        _server.setConnectionCallback(std::bind(&TranslateServer::onConnection,this,std::placeholders::_1));
        _server.setMessageCallback(std::bind(&TranslateServer::onMessage,this,std::placeholders::_1,
        std::placeholders::_2,std::placeholders::_3));

    }
    //启动服务器
    void start(){
        //开始事件监听
        _server.start();
        //开始事件监控，这是一个死循环阻塞接口
        _baseloop.loop();
    }
    private:
    //onConnection,应该是一个连接，建立成功，以及关闭的时候被调用
    void onConnection(const muduo::net::TcpConnectionPtr&conn){
        //新连接建立成功时的回调函数
        if(conn->connected() == true)
        {
            std::cout << "新连接成功！" << std::endl;
        }
        else
        {
            std::cout << "新连接关闭！" << std::endl;
        }
    }
    //具体的翻译处理事务
    std::string translate(const std::string str)
    {
        std::unordered_map<std::string,std::string> hash = {{"hello","你好"},{"你好","hello"}};
        auto res = hash.find(str);
        if(res == hash.end())
        {
            std::cout << "暂未推出该词翻译" << std::endl;
        }
        return res->second;
    }
    void onMessage(const muduo::net::TcpConnectionPtr& conn,muduo::net::Buffer* buf,muduo::Timestamp)
    {
        //通信连接收到请求时的回调函数
        //1.从buff中把请求的数据取出来
        std::string str = buf->retrieveAllAsString();
        //2.调用translate接口进行翻译
        std::string res = translate(str);
        //3.对客户端相应结果
        conn->send(res);
    }
    private:
    //_baseloop是epoll的事件监控，会进行描述符的事件监控，触发事件后进行io操作
    muduo::net::EventLoop _baseloop;
    //这个server对象，主要用于设置回调函数，用于告诉服务器收到了什么请求该如何处理
    muduo::net::TcpServer _server;
};


int main()
{
    TranslateServer server(8080);
    server.start();
    
    return 0;
}